package com.yupi.yupicturebackend.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.yupi.yupicturebackend.model.dto.game.*;
import com.yupi.yupicturebackend.model.entity.GameSession;

import java.util.List;
import java.util.Map;

/**
 * 游戏会话服务
 *
 * @author yupi
 */
public interface GameSessionService extends IService<GameSession> {

    /**
     * 创建拼图游戏
     *
     * @param imageUrl 图片URL
     * @param puzzleConfig 拼图配置
     * @param userId 用户ID
     * @return 游戏会话ID
     */
    String createPuzzleGame(String imageUrl, PuzzleConfig puzzleConfig, Long userId);

    /**
     * 创建找茬游戏
     *
     * @param imageUrl 图片URL
     * @param spotConfig 找茬配置
     * @param userId 用户ID
     * @return 游戏会话ID
     */
    String createSpotDifferenceGame(String imageUrl, SpotDifferenceConfig spotConfig, Long userId);

    /**
     * 创建记忆游戏
     *
     * @param imageUrls 图片URL列表
     * @param memoryConfig 记忆游戏配置
     * @param userId 用户ID
     * @return 游戏会话ID
     */
    String createMemoryGame(List<String> imageUrls, MemoryGameConfig memoryConfig, Long userId);

    /**
     * 创建AR滤镜
     *
     * @param filterConfig AR滤镜配置
     * @param userId 用户ID
     * @return 游戏会话ID
     */
    String createARFilter(ARFilterConfig filterConfig, Long userId);

    /**
     * 创建虚拟试穿
     *
     * @param userImageUrl 用户图片URL
     * @param tryOnConfig 试穿配置
     * @param userId 用户ID
     * @return 游戏会话ID
     */
    String createVirtualTryOn(String userImageUrl, VirtualTryOnConfig tryOnConfig, Long userId);

    /**
     * 创建涂色游戏
     *
     * @param imageUrl 图片URL
     * @param coloringConfig 涂色配置
     * @param userId 用户ID
     * @return 游戏会话ID
     */
    String createColoringGame(String imageUrl, ColoringGameConfig coloringConfig, Long userId);

    /**
     * 创建互动故事
     *
     * @param imageUrls 图片URL列表
     * @param storyConfig 故事配置
     * @param userId 用户ID
     * @return 游戏会话ID
     */
    String createInteractiveStory(List<String> imageUrls, InteractiveStoryConfig storyConfig, Long userId);

    /**
     * 获取游戏会话详情
     *
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 游戏会话
     */
    GameSession getGameSession(String sessionId, Long userId);

    /**
     * 开始游戏
     *
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean startGame(String sessionId, Long userId);

    /**
     * 暂停游戏
     *
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean pauseGame(String sessionId, Long userId);

    /**
     * 恢复游戏
     *
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean resumeGame(String sessionId, Long userId);

    /**
     * 更新游戏进度
     *
     * @param sessionId 会话ID
     * @param score 当前分数
     * @param progress 游戏进度
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean updateGameProgress(String sessionId, Integer score, Integer progress, Long userId);

    /**
     * 完成游戏
     *
     * @param sessionId 会话ID
     * @param finalScore 最终分数
     * @param gameResult 游戏结果
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean completeGame(String sessionId, Integer finalScore, Map<String, Object> gameResult, Long userId);

    /**
     * 放弃游戏
     *
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean abandonGame(String sessionId, Long userId);

    /**
     * 获取用户游戏历史
     *
     * @param userId 用户ID
     * @param gameType 游戏类型（可选）
     * @param limit 限制数量
     * @return 游戏历史列表
     */
    List<GameSession> getUserGameHistory(Long userId, String gameType, Integer limit);

    /**
     * 获取用户正在进行的游戏
     *
     * @param userId 用户ID
     * @return 正在进行的游戏列表
     */
    List<GameSession> getUserActiveGames(Long userId);

    /**
     * 获取用户游戏统计
     *
     * @param userId 用户ID
     * @return 游戏统计数据
     */
    Map<String, Object> getUserGameStatistics(Long userId);

    /**
     * 获取游戏排行榜
     *
     * @param gameType 游戏类型
     * @param difficulty 难度等级
     * @param limit 限制数量
     * @return 排行榜列表
     */
    List<Map<String, Object>> getGameLeaderboard(String gameType, String difficulty, Integer limit);

    /**
     * 获取热门游戏
     *
     * @param limit 限制数量
     * @return 热门游戏列表
     */
    List<Map<String, Object>> getPopularGames(Integer limit);

    /**
     * 获取推荐游戏
     *
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 推荐游戏列表
     */
    List<Map<String, Object>> getRecommendedGames(Long userId, Integer limit);

    /**
     * 检查游戏成就
     *
     * @param userId 用户ID
     * @param gameSession 游戏会话
     * @return 获得的成就列表
     */
    List<String> checkAchievements(Long userId, GameSession gameSession);

    /**
     * 计算经验值奖励
     *
     * @param gameSession 游戏会话
     * @return 经验值
     */
    Integer calculateExperienceReward(GameSession gameSession);

    /**
     * 获取游戏数据分析
     *
     * @param gameType 游戏类型
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 分析数据
     */
    Map<String, Object> getGameAnalytics(String gameType, String startDate, String endDate);

    /**
     * 导出游戏记录
     *
     * @param userId 用户ID
     * @param gameType 游戏类型
     * @param format 导出格式
     * @return 导出文件URL
     */
    String exportGameRecords(Long userId, String gameType, String format);
}
